import axios from 'axios';
import { message } from 'antd';
import { history } from '@umijs/max';
import { getToken, setToken, removeToken } from './auth';

// 创建一个标记，用于记录是否正在刷新token
let isRefreshing = false;
// 存储等待重试的请求
let retryRequests: Function[] = [];

// 创建axios实例
const request = axios.create({
  baseURL: '/api',
  timeout: 10000,
});

// 刷新token的方法
const refreshToken = async () => {
  try {
    // 确保使用带 Bearer 的 token
    const response = await axios.post('/auth/system/refreshToken', null, {
      headers: {
        'dhcc-auth': getToken() // getToken 已经处理了 Bearer 前缀
      }
    });

    if (response.data.code === 200) {
      // setToken 会自动添加 Bearer 前缀
      setToken(response.data.data);
      return response.data.data;
    }
    return null;
  } catch (error) {
    console.error('刷新token失败:', error);
    return null;
  }
};

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    const token = getToken(); // getToken 已经处理了 Bearer 前缀
    if (token) {
      config.headers['dhcc-auth'] = token;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    return response;
  },
  async (error) => {
    const originalRequest = error.config;

    // 如果响应状态是401（未授权）且没有重试过
    if (error.response?.status === 401 && !originalRequest._retry) {
      if (isRefreshing) {
        // 如果正在刷新token，将请求加入队列
        return new Promise((resolve) => {
          retryRequests.push((token: string) => {
            // 确保使用带 Bearer 的 token
            originalRequest.headers['dhcc-auth'] = `Bearer ${token}`;
            resolve(request(originalRequest));
          });
        });
      }

      originalRequest._retry = true;
      isRefreshing = true;

      try {
        const newToken = await refreshToken();
        if (newToken) {
          // 重试所有等待的请求
          retryRequests.forEach((callback) => callback(newToken));
          retryRequests = [];
          // 重试当前请求
          // 确保使用带 Bearer 的 token
          originalRequest.headers['dhcc-auth'] = `Bearer ${newToken}`;
          return request(originalRequest);
        } else {
          // token刷新失败，清除token并跳转到登录页
          removeToken();
          message.error('登录已过期，请重新登录');
          history.push('/user/login');
        }
      } catch (refreshError) {
        console.error('刷新token失败:', refreshError);
        removeToken();
        message.error('登录已过期，请重新登录');
        history.push('/user/login');
      } finally {
        isRefreshing = false;
      }
    }

    return Promise.reject(error);
  }
);

export default request;
